package org.iks.push.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageCodec;
import org.iks.common.pojo.message.Message;

import java.util.List;

/**
 * @author kzou
 * @date 2024/1/2 21:01
 * @description: 消息编解码器
 */
public class MessageCodec extends ByteToMessageCodec<Message> {

    /**
     * 魔术
     */
    private final byte[] magic = new byte[]{1, 2, 3, 4};

    private final byte version = 1;

    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, Message message, ByteBuf byteBuf) throws Exception {
        // 魔术 4 bytes
        byteBuf.writeBytes(magic);
        // 对齐字段 1 byte
        byteBuf.writeByte(0xff);
        // 协议版本 1 byte
        byteBuf.writeByte(version);
        // 序列化类型 1 byte
        byteBuf.writeByte(message.getSerialType());
        // 指令类型 1 byte
        byteBuf.writeByte(message.getMessageType()) ;
        // 消息正文长度 4 byte
        byteBuf.writeInt(message.getSerializedData().length);
        // 消息正文
        byteBuf.writeBytes(message.getSerializedData());
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        byte[] magic = new byte[4];
        byteBuf.readBytes(magic);
        byteBuf.readByte();
        // 版本号
        byte version = byteBuf.readByte();
        // 序列化类型
        byte serialType = byteBuf.readByte();
        // 指令类型
        byte action = byteBuf.readByte();
        // 长度
        int length = byteBuf.readInt();
        // 消息内容
        byte[] msgBody = new byte[length];
        byteBuf.readBytes(msgBody, 0, length);
        // 消息内容反序列化
        Message message = Message.deserializeData(msgBody, serialType, action);
        list.add(message);
    }

}
